package main

import (
	"compress/gzip"
	"fmt"
	"os"
)

func main() {

	fmt.Println("---------------gzip压缩---------------------")
	dst_file, e := os.Create("main/gzip/dst.gz")
	check_err_gzip(e)

	// NewWriter返回一个新的Writer。
	//压缩返回的写入器，并将其写入w。
	//完成后，调用方有责任在Writer上调用Close。
	//写入可能会被缓冲，直到关闭才刷新。
	//希望在Writer.Header中设置字段的调用者必须在首次调用Write，Flush或Close之前进行设置。
	//返回一个Writer对象，说明如下：

	// Writer是io.WriteCloser。
	//将写入Writer的内容压缩并写入w。
	//type Writer struct {
	//	Header      //在首次调用Write，Flush或Close时编写
	//	w           io.Writer
	//	level       int		//压缩的级别
	//	wroteHeader bool	//是否已经写入了元数据
	//	compressor  *flate.Writer	//压缩器
	//	digest      uint32 // CRC-32，IEEE多项式（第8节）
	//	size        uint32 //未压缩的大小（第2.3.1节）
	//	closed      bool	//关闭与否
	//	buf         [10]byte	//读取到的要压缩的数据的转载器
	//	err         error	//返回的错误
	//}
	//writer := gzip.NewWriter(dst_file)

	//.NewWriter()的压缩是默认压缩级别，我们还可以指定压缩的级别
	// NewWriterLevel类似于NewWriter，但是指定压缩级别，而不是假设DefaultCompression。
	//压缩级别可以是DefaultCompression，NoCompression，HuffmanOnly或BestSpeed和BestCompression之间的任何整数值。
	//如果级别有效，则返回的错误为nil。
	//writer, e := gzip.NewWriterLevel(dst_file, 1)//指定级别为1的话文件会大些，不过这里似乎无论指定什么级别都是无法更小的压缩了，这应该已经是最大的压缩率了
	writer, e := gzip.NewWriterLevel(dst_file, 9)//指定级别为1的话文件会大些，不过这里似乎无论指定什么级别都是无法更小的压缩了，这应该已经是最大的压缩率了
	check_err_gzip(e)

	src_file, e := os.Open("main/gzip/gzip.txt")
	check_err_gzip(e)

	info, e := src_file.Stat()
	check_err_gzip(e)

	src_byte:=make([]byte,info.Size())
	n, e := src_file.Read(src_byte)
	check_err_gzip(e)

	fmt.Println("源文件的字节数：",n)

	i, e := writer.Write(src_byte)
	check_err_gzip(e)
	//写入之后记得关闭文件
	// Close通过将所有未写入的数据刷新到基础io.Writer并写入GZIP页脚来关闭Writer。
	//它不会关闭底层的io.Writer。
	e= writer.Close()
	check_err_gzip(e)
	fmt.Println("写入压缩文件的字节数：",i)

	//写完之后dst_file也会达到文件的末尾的，所以我们需要将他的读写指针放到文件的开头
	ret, e := dst_file.Seek(0, 0)
	check_err_gzip(e)
	fmt.Println("重置压缩文件的读写指针到文件的开头，索引为：",ret)

	dst_byte:=make([]byte,info.Size())//压缩之后的文件应该不会大于源文件大小，所以我们这里给了源文件大小即可
	n2, e := dst_file.Read(dst_byte)
	check_err_gzip(e)

	fmt.Println("读取到的压缩文件的字节数：",n2)
	fmt.Println("压缩文件的字节是：",dst_byte)
	fmt.Println("压缩文件的字符串是：",string(dst_byte))

	defer func() {
		e = src_file.Close()
		check_err_gzip(e)
		//e = dst_file.Close()
		//check_err_gzip(e)
	}()
	//默认的压缩级别的输出：
	//	---------------gzip压缩---------------------
	//	源文件的字节数： 625
	//	写入压缩文件的字节数： 625
	//	重置压缩文件的读写指针到文件的开头，索引为： 0
	//	读取到的压缩文件的字节数： 462
	//	压缩文件的字节是： [31 139 8 0 0 0 0 0 0 255 100 145 221 114 154 92 20 134 207 191 153 239 30 50 185 179 36 55 178 65 84 36 40 38 241 7 129 214 159 138 90 27 131 29 211 116 3 27 184 24 215 90 123 115 196 45 116 118 205 244 32 57 127 103 61 239 122 222 38 175 110 110 239 84 92 73 239 32 123 51 26 85 152 69 117 171 64 51 151 145 128 172 211 8 87 150 3 12 11 124 116 85 92 209 36 149 129 165 99 47 43 244 28 220 63 66 241 4 156 209 244 13 120 95 206 99 149 188 66 206 32 181 207 204 172 205 111 144 133 151 140 12 44 249 252 12 156 161 215 199 108 68 126 114 117 125 5 197 64 29 91 228 196 181 241 116 117 125 102 38 150 54 249 165 180 222 62 99 113 189 69 39 164 81 66 174 33 3 171 222 204 136 39 40 60 58 62 0 207 81 48 220 222 227 240 225 61 28 126 165 95 198 153 153 138 25 170 181 84 27 67 247 210 240 184 17 174 170 102 50 154 147 159 144 19 99 54 194 177 115 102 230 255 255 1 239 67 222 254 231 66 7 239 127 98 88 232 234 131 4 170 47 192 115 72 123 138 181 33 157 171 100 140 97 137 135 13 164 139 75 23 185 206 112 103 40 214 214 130 108 159 162 4 251 139 122 213 161 40 195 40 107 132 139 67 151 22 191 49 218 81 121 210 223 216 223 33 11 26 225 66 58 167 168 167 37 246 210 15 160 11 133 118 75 200 171 15 148 186 219 69 111 162 150 46 58 59 237 250 115 135 224 85 11 155 164 90 82 212 67 47 81 173 2 127 24 52 136 209 62 190 111 185 46 65 4 152 86 116 10 241 224 99 180 147 129 133 67 75 110 251 245 244 165 94 249 192 157 70 184 53 11 84 213 69 207 71 97 234 203 127 111 214 108 72 124 136 98 44 237 142 158 206 89 208 233 40 139 41 30 5 100 1 122 123 242 19 224 12 248 254 50 206 153 153 55 183 119 127 2 0 0 255 255 75 11 195 191 113 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
	//	��K��pg(�ւl����zա(�(k��C��1�Qy����!�B:���%����vKȫ���Eo��.:;��s��U��ZR�C/Q�4��>�o�.A�Vt
	//	��c����CKn����^���F�5T�E�Ga��o�lH|�b,펞�Y��(�)dz{����2Ι�7�w  ��Kÿq

	//压缩级别为1时候的输出：
	//	---------------gzip压缩---------------------
	//	源文件的字节数： 625
	//	写入压缩文件的字节数： 625
	//	重置压缩文件的读写指针到文件的开头，索引为： 0
	//	读取到的压缩文件的字节数： 480
	//	压缩文件的字节是： [31 139 8 0 0 0 0 0 4 255 92 145 237 114 154 78 20 135 191 255 103 254 247 144 201 157 37 185 145 5 137 34 162 24 227 11 2 173 47 21 181 54 6 59 166 233 2 11 92 140 231 156 93 62 113 11 157 141 51 157 105 190 255 102 159 231 60 219 228 213 221 253 131 138 43 233 29 101 119 78 227 10 179 168 110 21 104 230 50 18 144 181 27 225 202 114 128 97 129 35 87 197 21 77 83 25 88 122 246 186 70 207 193 195 8 138 103 224 140 102 239 192 251 114 17 171 228 13 114 6 169 125 97 102 109 126 131 44 188 110 100 96 201 151 23 224 12 189 62 102 99 242 147 155 219 27 40 6 234 212 34 39 174 141 231 155 219 11 51 177 180 201 47 165 245 222 8 87 150 3 12 11 28 185 42 174 104 154 226 102 135 78 72 227 132 92 67 6 86 189 157 19 79 80 120 116 122 2 158 163 96 184 235 225 240 73 197 31 227 240 43 253 50 46 204 84 204 80 173 149 218 26 218 75 195 227 70 184 170 154 203 104 65 126 66 78 140 217 24 39 206 133 153 255 255 7 188 15 249 227 223 22 122 216 251 137 97 161 213 7 9 84 95 128 231 144 118 21 123 132 116 161 146 9 134 37 30 183 144 46 175 46 114 147 225 222 80 236 81 6 22 217 62 69 9 246 151 245 186 77 81 134 81 214 8 23 135 46 45 127 99 180 167 242 172 175 177 191 67 22 52 194 133 116 65 81 87 71 236 166 159 64 87 10 237 87 144 87 159 40 117 167 131 222 84 173 92 116 246 186 245 118 78 252 95 135 224 77 7 155 166 58 82 212 69 47 81 173 2 127 24 52 136 209 62 93 163 202 77 9 34 192 180 162 115 136 71 31 163 189 12 44 28 90 114 215 175 103 175 245 218 7 238 52 194 173 89 160 170 14 122 62 10 83 95 247 241 102 205 134 196 135 40 38 210 110 235 175 115 150 116 62 201 98 134 39 1 89 128 222 129 252 4 56 3 126 64 193 112 215 187 48 243 238 254 225 79 0 0 0 255 255 75 11 195 191 113 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
	//	压缩文件的字符串是：      �\��r�N���g���ɝ%���"���/�6;��\��]>q��3�i��f��<�������+�ewN�
	//	r�}afm~�,�nd`ɗ��>fc��(��"'����3���/��W��*�h��f�NH�\CV��OPxtz��`����I���+�2.�T�P����K��F����hA~BN��'΅�������z���a��	T_��v{�t��	�%��.�.r���P�Q�>E	����MQ�Q�.-c��򬯱�C4tAQWG즟@W
	//	�W�W�(u���T�\t���vN�_��M��:R�E/Q�4��>]��M	"���s�G��,Zrׯg����4­Y��z>
	//	S_��f͆ć(&�n�s�t>�b�'Y�ށ�8~@�p׻0����O   ��Kÿq


	fmt.Println("---------------gzip解压缩---------------------")
	//为了不再打开压缩文件，我们上面已经打开的压缩的文件暂时不关闭，以便于下面引用

	ret2, e := dst_file.Seek(0, 0)
	check_err_gzip(e)
	fmt.Println("重置压缩文件的读写指针到文件的开头，索引为：",ret2)

	reader, e := gzip.NewReader(dst_file)
	check_err_gzip(e)

	dst_byte2:=make([]byte,info.Size())
	// Read实现io.Reader，从其基础Reader读取未压缩的字节。
	n3, e := reader.Read(dst_byte2)

	fmt.Println("读取到的压缩文件解压后的字节数为：",n3)
	fmt.Println("压缩文件解压过后的字节为：",dst_byte2)
	fmt.Println("压缩文件解压过后的字符串为：",string(dst_byte2))

	e = reader.Close()
	check_err_gzip(e)

	/*输出：
		---------------gzip解压缩---------------------
		重置压缩文件的读写指针到文件的开头，索引为： 0
		读取到的压缩文件解压后的字节数为： 625
		压缩文件解压过后的字节为： [239 187 191 97 98 99 232 165 191 231 143 173 231 137 153 230 148 191 229 186 156 233 131 189 229 130 187 231 156 188 228 186 134 239 188 140 231 190 142 229 155 189 229 146 140 232 165 191 230 150 185 231 154 132 230 148 191 229 174 162 229 143 138 229 170 146 228 189 147 228 184 128 230 151 182 228 184 141 231 159 165 232 175 180 228 187 128 228 185 136 227 128 130 233 130 163 228 186 155 229 170 146 228 189 147 231 154 132 231 172 172 228 184 128 229 143 141 229 186 148 230 152 175 32 34 32 228 189 142 232 176 131 230 138 165 233 129 147 32 34 227 128 130 229 190 136 230 152 190 231 132 182 239 188 140 231 190 142 229 155 189 229 146 140 232 165 191 230 150 185 229 164 167 229 138 155 230 148 175 230 140 129 231 154 132 233 166 153 230 184 175 229 188 143 230 176 145 228 184 187 229 188 128 229 167 139 229 144 145 232 165 191 230 150 185 229 155 158 230 181 129 227 128 130 232 128 129 232 131 161 232 166 129 232 175 180 228 184 128 229 143 165 239 188 140 232 191 153 231 156 159 230 152 175 230 138 165 229 186 148 229 149 138 227 128 130 13 10 228 184 141 228 187 133 232 165 191 231 143 173 231 137 153 239 188 140 232 139 177 229 155 189 231 154 132 231 142 175 228 191 157 228 184 187 228 185 137 232 128 133 228 185 159 232 175 149 229 155 190 229 173 166 228 185 160 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 231 154 132 230 136 152 230 156 175 229 141 160 233 162 134 230 156 186 229 156 186 239 188 140 229 144 140 230 160 183 229 156 168 230 190 179 229 164 167 229 136 169 228 186 154 239 188 140 228 185 159 230 156 137 228 184 128 230 137 185 231 142 175 228 191 157 228 184 187 228 185 137 232 128 133 232 175 149 229 155 190 230 168 161 228 187 191 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 233 135 135 229 143 150 232 161 140 229 138 168 227 128 130 233 166 153 230 184 175 231 164 186 229 168 129 232 128 133 231 154 132 230 154 180 229 138 155 230 150 185 229 188 143 230 156 137 229 143 175 232 131 189 229 171 129 230 142 165 229 136 176 232 165 191 230 150 185 231 164 190 228 188 154 229 185 191 230 179 155 229 173 152 229 156 168 231 154 132 229 144 132 231 167 141 233 151 174 233 162 152 228 184 138 239 188 140 233 128 154 232 191 135 229 143 152 229 188 130 231 154 132 230 150 185 229 188 143 233 128 144 230 184 144 229 188 149 231 136 134 227 128 130 229 138 160 230 179 176 231 189 151 229 176 188 228 186 154 229 143 170 230 152 175 228 184 128 228 184 170 229 188 128 229 167 139 227 128 130 97 98 99]
		压缩文件解压过后的字符串为： ﻿abc西班牙政府都傻眼了，美国和西方的政客及媒体一时不知说什么。那些媒体的第一反应是 " 低调报道 "。很显然，美国和西方大力支持的香港式民主开始向西方回流。老胡要说一句，这真是报应啊。
		不仅西班牙，英国的环保主义者也试图学习香港示威者的战术占领机场，同样在澳大利亚，也有一批环保主义者试图模仿香港示威者采取行动。香港示威者的暴力方式有可能嫁接到西方社会广泛存在的各种问题上，通过变异的方式逐渐引爆。加泰罗尼亚只是一个开始。abc
	*/

}
func check_err_gzip(err error)  {
	if err != nil {
		fmt.Println(err)
	}
}




















